<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    

<script>
// ES5新增的数组方法：
// indexOf()
// lastIndexOf()
// forEach()
// map()
// filter()
// some()
// every()
// reduce()

// indexOf()返回数组中指定元素第一次出现的索引，没有返回-1（从左到右）
// var arr1 = [12,6,23,17,8,23,36];
// console.log( arr1.indexOf(23) );// 2
// console.log( arr1.indexOf(88) );// -1

// lastIndexOf()返回数组中指定元素第一次出现的索引，没有返回-1（从右到左）
// console.log( arr1.lastIndexOf(23) );// 5
// console.log( arr1.lastIndexOf(88) );// -1

// reduce(callback,initValue)遍历数组并构建一个最终的返回值（归并）
// callback 遍历数组时每次执行的函数
// initValue 初始值，可选
var arr = [1,2,3,4,5];

// 没有初始值：
var sum1 = arr.reduce(function (previous,current,index,array){
    // previous 上一次的返回值
    // current 当前遍历到的值
    // index 是current的下标
    // array 遍历的数据

    return previous += current;

    // 第1次执行：
    // previous的值为数组的第1个元素 1
    // current的值为数组的第2个元素 2
    // index的值为 1
    // 返回值 1+2

    // 第2次执行：
    // previous的值为上一次的返回值 3
    // current的值为数组的第3个元素 3
    // index的值为 2
    // 返回值 3+3

    // 第3次执行：
    // previous的值为上一次的返回值 6
    // current的值为数组的第4个元素 4
    // index的值为 3
    // 返回值 6+4

    // 第4次执行：
    // previous的值为上一次的返回值 10
    // current的值为数组的第5个元素 5
    // index的值为 4
    // 返回值 10+5

    // 返回15赋值给sum1

});
console.log( sum1 );// 15

// 有初始值：
var sum2 = arr.reduce(function (previous,current,index){
    // previous 上一次的返回值
    // current 当前遍历到的值
    // index 是current的下标

    return previous += current;

    // 第1次执行：
    // previous的值为初始值 0
    // current的值为数组第1个元素 1
    // index的值为 0
    // 返回值 0+1

    // 第2次执行：
    // previous的值为上一次的返回值 1
    // current的值为数组第2个元素 2
    // index的值为 1
    // 返回值 1+2

    // 第3次执行：
    // previous的值为上一次的返回值 3
    // current的值为数组第3个元素 3
    // index的值为 2
    // 返回值 3+3

    // 第4次执行：
    // previous的值为上一次的返回值 6
    // current的值为数组第4个元素 4
    // index的值为 3
    // 返回值 6+4

    // 第5次执行：
    // previous的值为上一次的返回值 10
    // current的值为数组第5个元素 5
    // index的值为 4
    // 返回值 10+5

    // 返回15赋值给sum2
},0);
console.log( sum2 );// 15


// 数组去重：
var arr2 = [1,2,3,4,5,4,3,2,1];
var arr3 = arr2.reduce(function (prev,curr){
    prev.indexOf(curr) === -1 && prev.push(curr);

    // if (prev.indexOf(curr) === -1) {
    //     prev.push(curr);
    // }

    return prev;

    // 1： 
    // prev = []
    // curr = 1
    // prev.push(1)
    // 返回值 [1]

    // 2:
    // prev = [1]
    // curr = 2
    // prev.push(2)
    // 返回值 [1,2]

    // 3:
    // prev = [1,2]
    // curr = 3
    // prev.push(3)
    // 返回值 [1,2,3]

    // 4:
    // prev = [1,2,3]
    // curr = 4
    // prev.push(4)
    // 返回值 [1,2,3,4]

    // 5:
    // prev = [1,2,3,4]
    // curr = 5
    // prev.push(5)
    // 返回值 [1,2,3,4,5]

    // 6:
    // prev = [1,2,3,4,5]
    // curr = 4
    // 返回值 [1,2,3,4,5]

    // ...
    
    // 最终返回 [1,2,3,4,5]
},[]);
console.log( arr3 );// [1, 2, 3, 4, 5]

</script>
</body>
</html>